import http from "../../../utils/https";

// service/pages/tenancy/tenancy.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 备注信息
    remarkContent: '',

    // 房屋信息
    houseInfo: {
      id: '',
      layout: '',
      rentAmount: 0,
      area: '',
      phone: '',
      landlordName: ''
    },
    // 租赁期限选项
    leasePeriods: ['1个月','3个月', '6个月', '1年', '2年'],
    leasePeriodIndex: -1,
    leasePeriod:'',
    
    // 押金方式选项
    depositTypes: [],
    depositTypeId: '', // 用于存储选中项的 id
    depositTypeIndex: -1 ,// 用于展示选中的 typename，可根据实际初始值调整
    
    // 入住日期
    checkinDate: '',
    startDate: '',
    endDate:'',
    
    // 费用计算
    displayRentAmount: 0,  // 顶部显示的租金
    inputRentAmount: 0,    // 费用明细中输入的租金
    inputDepositAmount: 0, // 费用明细中输入的押金
    depositAmount: 0,      // 计算得出的押金
    totalAmount: 0,        // 首次缴费总计
    
    // 协议同意状态
    isAgreed: false,
    
    // 表单验证
    canSubmit: false,
    
    // 租赁状态
    leaseStatus: 0, // 0: 待支付, 1: 已到期, 2: 生效中
    
    // 按钮文本
    buttonText: '',

    //合同编号
    contractNumber:''
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 获取传递的房屋信息
    if (options) {
      const rentAmount = parseFloat(options.rentAmount) || 0;
      const houseInfo = {
        id: options.id || '',
        layout: options.layout || '',
        rentAmount: rentAmount,
        area: options.area || '',
        phone: options.phone || '',
        landlordName: options.landlordName || '房东'
      };
      
      // 获取租赁状态
      const leaseStatus = this.data.leaseStatus
      
      // 根据状态设置按钮文本（静态设置）
      let buttonText = '立即支付';
      if (leaseStatus === 1) {
        buttonText = '再次租房';
      } else if (leaseStatus === 2) {
        buttonText = '申请续约';
      }
      
      this.setData({
        houseInfo: houseInfo,
        displayRentAmount: rentAmount,
        inputRentAmount: rentAmount,
        startDate: this.formatDate(new Date(),0),
        endDate: this.formatDate(new Date(),1),
        leaseStatus: leaseStatus,
        buttonText: buttonText,
        totalAmount: rentAmount, // 初始化首次缴费总计为租金金额
      });
      //自动生成合同编号
      this.getContractNumber();

      //获取押金方式列表
      this.getDepositTypes()
    }
  },
  

  /**
   * 格式化日期
   */
  formatDate(date, increment) {
    // 基于传入的原始日期创建一个新的 Date 对象，避免直接修改传入的日期
    const newDate = new Date(date); 
    // 获取当前的年份
    let year = newDate.getFullYear(); 
    // 获取当前的月份（注意：getMonth() 返回 0 - 11，对应 1 - 12 月）
    let month = newDate.getMonth(); 
    // 计算递增后的总月份数
    let totalMonths = month + 1 + increment; 

    // 处理月份超过 12 的情况，计算实际的年份和月份
    if (totalMonths > 12) {
        // 计算需要增加的年份数
        const addYears = Math.floor(totalMonths / 12); 
        // 计算剩余的月份数（1 - 12 之间）
        const remainingMonths = totalMonths % 12; 
        // 更新年份
        year += addYears; 
        // 更新月份（因为 getMonth() 是 0 开始，所以这里要减 1）
        month = remainingMonths - 1; 
    } else {
        // 不需要进位，直接更新月份（同样要考虑 getMonth() 是 0 开始）
        month = totalMonths - 1; 
    }

    // 设置新的月份到日期对象中
    newDate.setMonth(month); 
    // 设置新的年份到日期对象中
    newDate.setFullYear(year); 

    // 处理日期可能超出目标月天数的情况（比如原日期是 31 号，目标月是 4 月等小月）
    // 获取当前设置后的月份的天数
    const daysInMonth = new Date(year, month + 1, 0).getDate(); 
    // 获取原日期的日期（几号）
    let day = newDate.getDate(); 
    if (day > daysInMonth) {
        // 如果原日期的日期大于目标月的天数，就设置为目标月的最后一天
        newDate.setDate(daysInMonth); 
    }
    // 格式化年份、月份、日期并返回
    return `${year}-${String(month + 1).padStart(2, '0')}-${String(newDate.getDate()).padStart(2, '0')}`;
},

  /** 年份+1 */
   addOneYear(dateStr,increment) {
    // 将日期字符串转换为Date对象
    const date = new Date(dateStr);
    // 年份加1
    date.setFullYear(date.getFullYear() + increment);
    // 提取处理后的年、月、日，并格式化为字符串
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
},


  /**
   * 租客姓名输入
   */
  onNameInput(e) {
    this.setData({
      'tenantInfo.name': e.detail.value
    });
    this.validateForm();
  },

  /**
   * 联系电话输入
   */
  onPhoneInput(e) {
    this.setData({
      'tenantInfo.phone': e.detail.value
    });
    this.validateForm();
  },

  /**
   * 身份证号输入
   */
  onIdCardInput(e) {
    this.setData({
      'tenantInfo.idCard': e.detail.value
    });
    this.validateForm();
  },

  /**
   * 租赁期限选择
   */
  onLeasePeriodChange(e) {
    
    console.log();
    this.setData({
      leasePeriodIndex: parseInt(e.detail.value),
      leasePeriod:this.data.leasePeriods[e.detail.value]
    });
    this.validateForm();
  },

  /**
   * 入住日期选择
   */
  onCheckinDateChange(e) {
    this.setData({
      checkinDate: e.detail.value
    });
    this.validateForm();
  },

  /** 押金方式 */
  onDepositTypeChange(e){
    const index = e.detail.value;
    const selectedItem = this.data.depositTypes[index];
    this.setData({
      depositTypeIndex: index,
      depositTypeId: selectedItem.id 
    });
    console.log("id为",selectedItem.id );
  },
  
  /**
   * 更新按钮状态
   */
  updateButtonStatus() {
    const { leaseStatus } = this.data;
    let buttonText = '立即支付';
    
    // 根据状态设置按钮文本
    switch(leaseStatus) {
      case 2: // 生效中
        buttonText = '申请续约';
        break;
      case 1: // 已到期
        buttonText = '再次租房';
        break;
      case 0: // 待支付
      default:
        buttonText = '立即支付';
        break;
    }
    
    this.setData({
      buttonText: buttonText
    });
  },

  /**
   * 切换协议同意状态
   */
  toggleAgreement() {
    this.setData({
      isAgreed: !this.data.isAgreed
    });
    this.validateForm();
  },

  /**
   * 查看租赁协议
   */
  viewAgreement(e) {
    e.stopPropagation();
    wx.showModal({
      title: '租赁协议',
      content: '这里是租赁协议的详细内容...\n\n1. 租赁双方的权利和义务\n2. 租金支付方式和时间\n3. 房屋使用规定\n4. 违约责任\n5. 其他约定事项',
      showCancel: false,
      confirmText: '我知道了'
    });
  },


  /**
   * 表单验证
   */
  validateForm() {
    const { leasePeriodIndex, checkinDate, isAgreed } = this.data;
    
    const isValid = leasePeriodIndex >= 0 &&
                   checkinDate !== '' &&
                   isAgreed; 
    
    this.setData({
      canSubmit: isValid
    });
  },

  /**
   * 联系房东
   */
  contactLandlord() {
    wx.makePhoneCall({
      phoneNumber: this.data.houseInfo.phone,
      success: function () {
        console.log("拨打电话成功！")
      },
      fail: function () {
        wx.showToast({
          title: '拨打失败',
          icon: 'error'
        });
      }
    });
  },

  /**
   * 提交租赁申请或执行其他操作
   */
  submitLease() {
    const { leaseStatus } = this.data;

    // 根据租赁状态执行不同操作
    switch(leaseStatus) {
      case 2: // 生效中
        this.applyRenewal();
        break;
      case 1: // 已到期
        this.rentAgain();
        break;
      case 0: // 待支付
      default:
        this.payNow();
        break;
    }
  },
  
  
  /**
   * 提交新租赁申请
   */
  submitNewLease() {
    if (!this.data.canSubmit) {
      wx.showToast({
        title: '请完善租赁信息',
        icon: 'error'
      });
      return;
    }

    const { houseInfo, tenantInfo, leasePeriods, leasePeriodIndex, depositTypes, depositTypeIndex, checkinDate, totalAmount, inputRentAmount, inputDepositAmount } = this.data;
    
    const leaseData = {
      houseId: houseInfo.id,
      tenantName: tenantInfo.name,
      tenantPhone: tenantInfo.phone,
      tenantIdCard: tenantInfo.idCard,
      leasePeriod: leasePeriods[leasePeriodIndex],
      depositType: depositTypes[depositTypeIndex],
      checkinDate: checkinDate,
      rentAmount: inputRentAmount,
      depositAmount: inputDepositAmount,
      totalAmount: totalAmount,
      residentId: wx.getStorageSync('residentId')
    };

    wx.showLoading({
      title: '提交中...'
    });

    // 这里调用API提交租赁申请
    http.post('lease/application', leaseData)
      .then(resp => {
        wx.hideLoading();
        wx.showModal({
          title: '申请成功',
          content: '您的租赁申请已提交，房东将在24小时内联系您确认详情。',
          showCancel: false,
          success: () => {
            wx.navigateBack();
          }
        });
      })
      .catch(err => {
        wx.hideLoading();
        wx.showToast({
          title: '提交失败，请重试',
          icon: 'error'
        });
        console.error('提交租赁申请失败:', err);
      });
  },
  
  /**
   * 申请续约
   */
  applyRenewal() {
    if (!this.data.canSubmit) {
      wx.showToast({
        title: '请完善租赁信息',
        icon: 'error'
      });
      return;
    }
    
    wx.showLoading({
      title: '提交中...'
    });
    
    const { houseInfo, leasePeriods, leasePeriodIndex, checkinDate, inputRentAmount } = this.data;
    
    const renewalData = {
      houseId: houseInfo.id,
      leasePeriod: leasePeriods[leasePeriodIndex],
      startDate: checkinDate,
      rentAmount: inputRentAmount,
      residentId: wx.getStorageSync('residentId')
    };
    
    // 调用续约API
    http.post('lease/renewal', renewalData)
      .then(resp => {
        wx.hideLoading();
        wx.showModal({
          title: '申请成功',
          content: '您的续约申请已提交，房东将尽快与您联系确认。',
          showCancel: false,
          success: () => {
            wx.navigateBack();
          }
        });
      })
      .catch(err => {
        wx.hideLoading();
        wx.showToast({
          title: '提交失败，请重试',
          icon: 'error'
        });
        console.error('提交续约申请失败:', err);
      });
  },
  
  /**
   * 再次租房
   */
  rentAgain() {
    this.submitNewLease();
  },
  
  /**
   * 立即支付
   */
  payNow() {
    wx.showLoading({
      title: '准备支付...'
    });
    
    //定义参数
    let params={
      contractNumber:this.data.contractNumber,
      actualRentAmount:this.data.inputRentAmount,
      depositAmount:this.data.inputDepositAmount,
      depositMethodId:this.data.depositTypeId,
      leaseStartDate:this.data.checkinDate,
      residentId:wx.getStorageSync('residentId'),
      houseRentalId:parseInt(this.data.houseInfo.id)
    }

    //获取到租赁时长
    const payCycle=this.data.leasePeriod

    //将入住时间转换为日期类型
    const date=new Date(this.data.checkinDate);
    params.nextPaymentDate=this.formatDate(date,1)
    if(payCycle=='1个月'){
      const newDate=this.formatDate(date,1)
      params.leaseEndDate=newDate
    }else if(payCycle=='3个月'){
      console.log("3");
      const newDate=this.formatDate(date,3)
      params.leaseEndDate=newDate
    }else if(payCycle=='6个月'){
      console.log("6");
      const newDate=this.formatDate(date,6)
      params.leaseEndDate=newDate
    }else if(payCycle=='1年'){
      console.log("11");
      const newDate=this.addOneYear(date,1)
      params.leaseEndDate=newDate
    }else if(payCycle=='2年'){
      console.log("22");
      const newDate=this.addOneYear(date,2)
      params.leaseEndDate=newDate
    }

    console.log("请求参数信息",params);

    http.post('contract/contract',params)
    .then(resp=>{
      if(resp.code==200){
        //申请成功跳转页面
        wx.hideLoading();
        
        // 构建跳转参数
        const navigationParams = {
          layout: this.data.houseInfo.layout,
          leasePeriod: this.data.leasePeriod,
          checkinDate: this.data.checkinDate,
          rentAmount: this.data.inputRentAmount,
          depositAmount: this.data.inputDepositAmount,
          totalAmount: this.data.totalAmount,
          orderId: this.data.contractNumber,
          remark: this.data.remarkContent || ''
        };
        

        console.log("跳转参数",navigationParams);

        // 将参数转换为URL查询字符串
        const queryString = Object.keys(navigationParams)
          .map(key => `${key}=${encodeURIComponent(navigationParams[key])}`)
          .join('&');
        
        // 跳转到租赁成功页面
        wx.navigateTo({
          url: `/service/pages/leaseSuccess/leaseSuccess?${queryString}`
        });
      }
    })
    .catch(err=>{
      console.log("请求失败",err);
      wx.hideLoading()
    })

  },

    //生成合同编号
    getContractNumber(){
      const timeTemp=Date.now();
      const prefix = 'HT'
      this.setData({
        contractNumber:prefix+timeTemp
      })
    },
    //获取押金方式
    getDepositTypes(){
      http.get('depositMethod/depositMethod/list')
      .then(resp=>{
        console.log("请求成功");
        this.setData({
          depositTypes:resp.rows
        })
      })
      .catch(err=>{
        console.log("请求失败",err);
      })
    },

    /** 修改月租金 */
    onRentAmountChange(e){
      const amount = Number(e.detail.value)
      this.setData({
        inputRentAmount:amount,
        totalAmount:amount+this.data.inputDepositAmount
      })
    },
    /** 修改押金 */
    onDepositAmountChange(e){
      const amount = Number(e.detail.value)
      this.setData({
        inputDepositAmount:amount,
        totalAmount:amount+this.data.inputRentAmount
      })
    },

    /**
     * 备注信息输入
     */
    onRemarkChange(e) {
      this.setData({
        remarkContent: e.detail.value
      });
    },


  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
    return {
      title: '租房申请',
      path: '/service/pages/tenancy/tenancy'
    };
  },

})
